import axios from 'axios';
import router from '../router';

// 处理认证错误
function handleAuthError() {
  // 防止重复处理
  if (localStorage.getItem('auth_error_processing')) {
    return;
  }
  
  // 设置标志，防止重复处理
  localStorage.setItem('auth_error_processing', 'true');
  
  console.warn('检测到Token无效，正在清除登录状态...');
  localStorage.removeItem('token');
  localStorage.removeItem('userInfo');
  localStorage.removeItem('userRole');
  
  // 使用setTimeout避免路由问题，并清除处理标志
  setTimeout(() => {
    if (router.currentRoute.value.path !== '/auth/login') {
      router.push('/auth/login');
    }
    localStorage.removeItem('auth_error_processing');
  }, 100);
}

// 创建axios实例
const request = axios.create({
  baseURL: '',  // 不设置baseURL，因为API路径已包含/api前缀
  timeout: 15000,
});

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 从localStorage获取token
    const token = localStorage.getItem('token');
    
    if (token) {
      // 添加更多的token调试信息
      console.log('API请求:', config.url);
      console.log('Token长度:', token.length);
      console.log('Token前20个字符:', token.substring(0, 20));
      console.log('Token最后20个字符:', token.substring(token.length - 20));
      
      // 检查token是否为有效字符串
      const isValidToken = /^[A-Za-z0-9\-_=]+\.[A-Za-z0-9\-_=]+\.[A-Za-z0-9\-_.+/=]*$/.test(token);
      console.log('Token是否符合JWT格式:', isValidToken);
      
      if (!isValidToken) {
        console.error('无效的JWT格式，将不发送请求', token);
        // 清除无效token
        localStorage.removeItem('token');
        return Promise.reject(new Error('无效的JWT格式'));
      }
      
      config.headers.Authorization = `Bearer ${token}`;
    } else {
      console.warn('API请求:', config.url, '未找到token');
    }
    
    // 添加时间戳防止缓存
    if (config.method === 'get') {
      config.params = {
        ...config.params,
        _t: Date.now()
      };
    }
    
    return config;
  },
  error => {
    console.error('请求错误', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  response => {
    const res = response.data;
    
    // 检查响应是否成功
    if (!res.success && res.code !== 200) {
      console.error('请求失败', res.message || '未知错误');
      // 检查是否是认证错误 
      if (res.code === 401 || res.code === 403 || 
          (res.message && (res.message.includes('token') || res.message.includes('JWT')))) {
        handleAuthError();
      }
      return Promise.reject(new Error(res.message || '未知错误'));
    }
    
    // 直接返回完整响应，由调用方处理数据结构
    return res;
  },
  error => {
    // 处理401未授权或JWT错误
    if ((error.response && (error.response.status === 401 || error.response.status === 403)) ||
        (error.message && (error.message.includes('token') || 
                          error.message.includes('JWT') || 
                          error.message.includes('unable to read')))) {
      handleAuthError();
    }
    
    console.error('响应错误', error.message);
    return Promise.reject(error);
  }
);

export default request;
